/*  see copyright notice in squirrel.h */
#ifndef _SQOPCODES_H_
#define _SQOPCODES_H_

#define MAX_FUNC_STACKSIZE 0xFF
#define MAX_LITERALS ((SQInteger)0x7FFFFFFF)

enum BitWiseOP
{
	BW_AND = 0,
	BW_OR = 2,
	BW_XOR = 3,
	BW_SHIFTL = 4,
	BW_SHIFTR = 5,
	BW_USHIFTR = 6
};

enum CmpOP
{
	CMP_G = 0,
	CMP_GE = 2,
	CMP_L = 3,
	CMP_LE = 4,
	CMP_3W = 5
};

enum NewObjectType
{
	NOT_TABLE = 0,
	NOT_ARRAY = 1,
	NOT_CLASS = 2
};

enum AppendArrayType
{
	AAT_STACK = 0,
	AAT_LITERAL = 1,
	AAT_INT = 2,
	AAT_FLOAT = 3,
	AAT_BOOL = 4
};

enum SQOpcode
{
	_OP_LINE = 0x00,
	_OP_LOAD = 0x01,
	_OP_LOADINT = 0x02,
	_OP_LOADFLOAT = 0x03,
	_OP_DLOAD = 0x04,
	_OP_TAILCALL = 0x05,
	_OP_CALL = 0x06,
	_OP_PREPCALL = 0x07,
	_OP_PREPCALLK = 0x08,
	_OP_GETK = 0x09,
	_OP_MOVE = 0x0A,
	_OP_NEWSLOT = 0x0B,
	_OP_DELETE = 0x0C,
	_OP_SET = 0x0D,
	_OP_GET = 0x0E,
	_OP_EQ = 0x0F,
	_OP_NE = 0x10,
	_OP_ADD = 0x11,
	_OP_SUB = 0x12,
	_OP_MUL = 0x13,
	_OP_DIV = 0x14,
	_OP_MOD = 0x15,
	_OP_BITW = 0x16,
	_OP_RETURN = 0x17,
	_OP_LOADNULLS = 0x18,
	_OP_LOADROOT = 0x19,
	_OP_LOADBOOL = 0x1A,
	_OP_DMOVE = 0x1B,
	_OP_JMP = 0x1C,
	//_OP_JNZ=              0x1D,
	_OP_JCMP = 0x1D,
	_OP_JZ = 0x1E,
	_OP_SETOUTER = 0x1F,
	_OP_GETOUTER = 0x20,
	_OP_NEWOBJ = 0x21,
	_OP_APPENDARRAY = 0x22,
	_OP_COMPARITH = 0x23,
	_OP_INC = 0x24,
	_OP_INCL = 0x25,
	_OP_PINC = 0x26,
	_OP_PINCL = 0x27,
	_OP_CMP = 0x28,
	_OP_EXISTS = 0x29,
	_OP_INSTANCEOF = 0x2A,
	_OP_AND = 0x2B,
	_OP_OR = 0x2C,
	_OP_NEG = 0x2D,
	_OP_NOT = 0x2E,
	_OP_BWNOT = 0x2F,
	_OP_CLOSURE = 0x30,
	_OP_YIELD = 0x31,
	_OP_RESUME = 0x32,
	_OP_FOREACH = 0x33,
	_OP_POSTFOREACH = 0x34,
	_OP_CLONE = 0x35,
	_OP_TYPEOF = 0x36,
	_OP_PUSHTRAP = 0x37,
	_OP_POPTRAP = 0x38,
	_OP_THROW = 0x39,
	_OP_NEWSLOTA = 0x3A,
	_OP_GETBASE = 0x3B,
	_OP_CLOSE = 0x3C
};

struct SQInstructionDesc
{
	const SQChar *name;
};

struct SQInstruction
{
	SQInstruction(){};
	SQInstruction(SQOpcode _op, SQInteger a0 = 0, SQInteger a1 = 0,
			SQInteger a2 = 0, SQInteger a3 = 0)
	{
		op = (unsigned char)_op;
		_arg0 = (unsigned char)a0;
		_arg1 = (SQInt32)a1;
		_arg2 = (unsigned char)a2;
		_arg3 = (unsigned char)a3;
	}


	SQInt32 _arg1;
	unsigned char op;
	unsigned char _arg0;
	unsigned char _arg2;
	unsigned char _arg3;
};

#include "squtils.h"
typedef sqvector<SQInstruction> SQInstructionVec;

#define NEW_SLOT_ATTRIBUTES_FLAG 0x01
#define NEW_SLOT_STATIC_FLAG 0x02

#endif // _SQOPCODES_H_
